package com.wnzt.baszh.util.common;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
import java.util.ResourceBundle;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

/**
 * FTP下载文件
 * 
 * @author dqw
 * @date 2017-4-20
 */
public class FTPUtil {
	public static final String KEY = "key"; // 加密密匙
	public static final FileEncodeAndDecode encode = new FileEncodeAndDecode(
			KEY); // 加密方法
	public static String DECODEPATH = ""; // 解密后的路径
	private static FTPClient ftpClient = new FTPClient();
	private static String encoding = System.getProperty("file.encoding");

	/**
	 * Description: 从FTP服务器下载文件
	 * 
	 * @Version1.0
	 * @param url
	 *            FTP服务器hostname
	 * @param port
	 *            FTP服务器端口
	 * @param username
	 *            FTP登录账号
	 * @param password
	 *            FTP登录密码
	 * @param remotePath
	 *            FTP服务器上的相对路径
	 * @param fileName
	 *            要下载的文件名
	 * @param localPath
	 *            下载后保存到本地的路径
	 * @param postfix
	 *            文件后缀名
	 * @param copyPath
	 *            临时存放图片的工程根目录
	 * @return
	 */

	public static boolean downFile(String url, int port, String username,
			String password, String remotePath, String fileName,
			String localPath, String postfix) {
		boolean result = false;
		try {
			int reply;
			ftpClient.setControlEncoding(encoding);

			/*
			 * 为了上传和下载中文文件，有些地方建议使用以下两句代替 new
			 * String(remotePath.getBytes(encoding),"iso-8859-1")转码。 经过测试，通不过。
			 */
			// FTPClientConfig conf = new
			// FTPClientConfig(FTPClientConfig.SYST_NT);
			// conf.setServerLanguageCode("zh");

			ftpClient.connect(url, port);
			// 如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftpClient.login(username, password);// 登录
			// 设置文件传输类型为二进制
			ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
			// 获取ftp登录应答代码
			reply = ftpClient.getReplyCode();
			// 验证是否登陆成功
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftpClient.disconnect();
				System.err.println("FTP连接失败,请重新连接.");
				return result;
			}
			ftpClient.setControlEncoding("GBK");
			// 转移到FTP服务器目录至指定的目录下
			remotePath=new String(remotePath.getBytes("GBK"),"iso-8859-1");                    
            if (!ftpClient.changeWorkingDirectory(remotePath)) {
            	ftpClient.makeDirectory(remotePath);
            	ftpClient.changeWorkingDirectory(remotePath);
            }
			/*ftpClient.changeWorkingDirectory(new String(("/"+remotePath)
					.getBytes(encoding), "iso-8859-1"));*/
			/*
			 * String serverPath =
			 * request.getSession().getServletContext().getRealPath
			 * ("/upload/image"); System.out.println("服务器路径为："+serverPath);
			 */
            
            
			try {
				
			} catch (Exception e) {
				e.printStackTrace();
			}
			// 获取文件列表
			FTPFile[] fs = ftpClient.listFiles();
			for (FTPFile ff : fs) {
				System.out.println(new String(ff.getName().getBytes("GBK"),"GBK"));
				if (new String(ff.getName().getBytes("utf-8"),"iso-8859-1").equals(new String((fileName + postfix).getBytes("GBK"),"iso-8859-1"))) {
					FileUtil.createFile(localPath+"/" + fileName + postfix);
					File path = new File(localPath+"/" + fileName + postfix);
					File localFile = new File(path + "/" + ff.getName());
					OutputStream is = new FileOutputStream(localFile);
					ftpClient.retrieveFile(ff.getName(), is);
					is.close();
				}
			}

			ftpClient.logout();
			result = true;
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (ftpClient.isConnected()) {
				try {
					ftpClient.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return result;
	}

	
	/**
	 * 将FTP服务器上文件下载到本地
	 * 
	 */
	public void testDownFile(String fileName, String postfix, String copyPath) {
		// 获取配置文件信息
		ResourceBundle rb = ResourceBundle.getBundle("FTPUser");
		String username = rb.getString("username");
		String password = rb.getString("pwd");
		String remotePath = rb.getString("remotePath");
		String localPath = rb.getString("localPath");
		String url = rb.getString("url");
		String Port = rb.getString("port");
		int port;
		try {
			port = Integer.parseInt(Port);
			boolean flag = downFile(url, port, username, password, remotePath,
					fileName, localPath, postfix);
			System.out.println("下载结果是=" + flag);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Description: 向FTP服务器上传文件
	 * 
	 * @Version1.0 Jul 27, 2008 4:31:09 PM by 崔红保（cuihongbao@d-heaven.com）创建
	 * @param url
	 *            FTP服务器hostname
	 * @param port
	 *            FTP服务器端口
	 * @param username
	 *            FTP登录账号
	 * @param password
	 *            FTP登录密码
	 * @param path
	 *            FTP服务器保存目录
	 * @param filename
	 *            上传到FTP服务器上的文件名
	 * @param input
	 *            输入流
	 * @return 成功返回true，否则返回false
	 */
	public static boolean uploadFile(String url, int port, String username,
			String password, String path, String filename, InputStream input) {
		boolean success = false;
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			ftp.connect(url, port);// 连接FTP服务器
			// 如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.login(username, password);// 登录
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return success;
			}
			ftp.enterLocalPassiveMode();  
			ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);  
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			ftp.setControlEncoding("GBK");

			path=new String(path.getBytes("GBK"),"iso-8859-1");                    
            if (!ftp.changeWorkingDirectory(path)) {
            	ftp.makeDirectory(path);
            	ftp.changeWorkingDirectory(path);
            }
			
            boolean result = ftp.storeFile(new String(filename.getBytes("GBK"),"iso-8859-1"), input);

			input.close();
			ftp.logout();
			success = true;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return success;
	}
	
	/**
	 * 文件上传至PDF服务器
	 * @author [lv tang wei]
	 * Describe:
	 * @param path 		FTP保存路径
	 * @param filename	上次文件名
	 * @param input		上传文件流
	 * @return
	 * [2017年7月7日]
	 */
	public static boolean uploadFile(String path, String filename, InputStream input){
		/*取资源文档目录*/
		String dir = Thread.currentThread().getContextClassLoader().getResource("").getPath();
		/*读取配置文件*/
		Map<String,String> prop=SetSystemProperty.propertiesToMap(dir+"/config.properties");
		//ftp://172.31.0.235/
		String url=prop.get("upload.pdf.url");
		int port=Integer.parseInt(prop.get("upload.pdf.port"));
		String username=prop.get("upload.pdf.username");
		String password=prop.get("upload.pdf.password");
		return uploadFile(url, port, username, password, path, filename, input);
	}

	public static void main(String[] args) {
		String fileName = "2017419174837";
		String postfix = ".jpg";
		String copyPath = "";
		FTPUtil fa = new FTPUtil();
		fa.testDownFile(fileName, postfix, copyPath);
	}

}
